Description
有 $n$ 道菜,$m$ 个厨师。第 $j$ 个厨师做第 $i$ 道菜的时间为 $t_{i,j}$。有 $p_i$ 个人点第 $i$ 道菜。每个人的等待时间为 $0$ 到他点的菜品做完的时间。求最小的等待时间之和。
数据范围:$n<=40, m<=100, p<=800, t_{i,j}<=1000$ (其中 $p=∑p_i$)
Solution
把每道菜看做一个点,与源点连接,第 $i$ 道菜的流量为 $p_i$,费用为 $0$。把厨师拆成 $m$ * $p$ $(p=∑p_i)$ 个点,表示倒数第 $1–m$ 个时刻的所有厨师。把这些厨师与所有菜相连,流量为 $1$,费用为 $k$ * $a_{i,j}$。
证明:对于一道菜 $i$,其 被等待 的时间为 $k*a_{i,j}$($k$ 为当前层数,$j$ 为当前厨师)。所有菜品的被等待时间相加即为所求的总等待时间。
最后把所有时刻的厨师与汇点相连,流量为 $1$,费用为 $0$。跑一遍费用流,即可得到 $60$ 分。
动态开点
先建立初始图,第一层的所有厨师与所有菜品和汇点相连。第一次一定找到了一条增广路,经过了其中一个厨师。第二次把当前厨师的下一层与所有菜品和汇点连上,再找一次增广路。到了最后所有的边都被连上了。
Code
1 |
|